package XunChunCPU.common.Bundles

import chisel3._
import XunChunCPU.common.CommonConfig._
import XunChunCPU.common._

// 控制信号，不包含指令本身内容
class ControlInfo
    extends Bundle{
    // 指令是否有效
    val InstrValid = Output(Bool())
    // 该指令是否写入寄存器
    val regwe = Output(Bool())
    // 写入寄存器地址   rd | rt | 31号寄存器
    val wAddrSel = Output(UInt(2.W))
    // 操作数A来源： rs
    val ASel = Output(UInt(3.W))
    // 操作数B来源： rt | 立即数
    val BSel = Output(UInt(3.W))
    // 立即数拓展类型 ZeroExt | SignExt
    val immExtType = Output(UInt(2.W))
    // Exe执行阶段的Op,暂定8位
    val op = Output(UInt(8.W))
}
trait ControlConfig {
    // 指令是否有效
    val InstrY = true.B             // 指令有效
    val InstrN = false.B            // 指令无效
    // 是否写入寄存器
    val wEnable = true.B            // 写入寄存器
    val wDisable = false.B          // 不写入寄存器
    // 写入寄存器地址
    val wAddr_0  = 0.U              // 写入0号寄存器（不写入寄存器）
    val wAddr_rd = 1.U              // 写入rd寄存器
    val wAddr_rt = 2.U              // 写入rt寄存器
    val wAddr_31 = 3.U              // 写入31号寄存器
    // 操作数来源
    val FromRS   = 0.U              // 来自rs寄存器
    val FromRT   = 1.U              // 来自rt寄存器
    val FromRD   = 2.U              // 来自rd寄存器
    val FromImm  = 3.U              // 来自立即数
    val FromAddrImm = 4.U           // 来自地址立即数
    val FromZero     = 5.U              // 为0
    val FromSA = 6.U                // 来自sa字段
    val FromOffset = 7.U            // 来自offset字段的符号拓展加上base寄存器
    // 立即数拓展类型
    val ZeroExt  = 0.U              // 0拓展
    val SignExt  = 1.U              // 符号拓展
    val SaExtract= 2.U              // 提取（Extract）IMM中的SA字段
}